package demo2;

/**
 * Description:
 * Date: 2025-10-16
 * Time: 21:34
 *///
public class Test {
    public static void main1(String[] args) throws CloneNotSupportedException{
        Person person1 = new Person("zhansan",17);

        //将person1指向的引用拷贝一份出来在堆中，然后将拷贝出来的这份内存地址给到person2
        //person1中的成员变量也一起拷贝了  (注：此时的拷贝称为浅拷贝)
        Person person2 = (Person) person1.clone();//因为clone()方法的返回值是Object，需要向下转型

        System.out.println(person1.name);
        System.out.println(person2.name);
        System.out.println(person1.age);
        System.out.println(person2.age);
    }

    public static void main2(String[] args) throws CloneNotSupportedException{
        Person person1 = new Person("zhansan",17);
        Person person2 = (Person) person1.clone();

        //此时的person2是拷贝了一份person1中的内容，连其中的实例变量也拷贝了一份
        //但是：只是拷贝了实例变量的引用(地址)过去，此时person2中的aTry与person1中的aTry指向同一个引用

        System.out.println(person1.name);
        System.out.println(person2.name);
        System.out.println(person1.age);
        System.out.println(person2.age);
        System.out.println("================");

        //我使用person1中的aTry引用进行初始化，然后调用person2中的aTry引用修改，结果是修改成功
        person1.aTry.data = 10;
        System.out.println(person1.aTry.data);
        System.out.println(person2.aTry.data);
        person2.aTry.data = 123;
        System.out.println(person1.aTry.data);
        System.out.println(person2.aTry.data);
    }

    public static void main(String[] args) throws CloneNotSupportedException{
        //如何将person1中的aTry引用也拷贝一份新的给person2中呢?
        //1.Try类实现Cloneable接口并重写clone() 方法
        //2.修改Perosn类中的clone() 方法，使其在拷贝的时候 同时 还通过aTry引用调用Try类中的clone()方法
        //   将aTry对象也拷贝一份

        Person person1 = new Person("zhansan",17);
        Person person2 = (Person) person1.clone();

        person1.aTry.data = 10;
        person2.aTry.data = 100;
        System.out.println(person1.aTry.data);
        System.out.println(person2.aTry.data);
        person2.aTry.data = 123;
        System.out.println(person1.aTry.data);
        System.out.println(person2.aTry.data);
    }
}
